"""
@author: xxw
@file: 01.装饰器.py
@time: 2023/6/12 14:28
"""

# 实现闭包的三个条件：
# 1、内函数使用外函数的局部变量
# 2、外函数返回内函数
# 3、使用嵌套函数，外函数嵌套内函数

# 装饰器：在不改变类或函数源代码的基础上，给类或者函数添加一些额外的功能
# 实现装饰器的基础是闭包函数，他需要把一个callable函数
# 使用@ -- 修饰符
import time
import functools
from logset import logger

def runtime(func):
    # 保留原数据，将func的源数据全部赋值给inner
    @functools.wraps(func)
    def inner(*args, **kwargs):  # *args  **kwargs 让装饰器更加通用
        start = time.time()
        result = func(*args, **kwargs) #原函数执行
        end = time.time()
        print(f"函数执行花了{end-start}s")
        # print(f"执行了{func.__name__}函数")
        return result             #inner函数返回原函数的返回值
    return inner

def log(func):
    def inner_log(*args, **kwargs):
        logger.info(f"开始执行{func.__name__}函数")
        result = func(*args, **kwargs)
        logger.info(f"{func.__name__}函数，执行结束！")
        return result
    return inner_log

@log            #test_func = log(test_func)
@runtime        #test_func = runtime(test_func)
def test_func():
    time.sleep(1)
    print("i am test_func")

test_func()


##################
# 添加额外功能
# 统计运行时间
# 权限控制
# 日志记录

# 执行了什么函数 -- 写入日志，记录INFO等级，写到文件和屏幕
# 计时功能装饰器

